package com.zdp.leetcodeMiddle;


import com.zdp.util.TreeNode;

import java.util.ArrayList;
import java.util.List;

/*
* 题目描述：
* 给定一个二叉树和一个目标和，找到所有从根节点到叶子节点路径总和等于给定目标和的路径。
说明: 叶子节点是指没有子节点的节点。
示例:
给定如下二叉树，以及目标和 sum = 22，

              5
             / \
            4   8
           /   / \
          11  13  4
         /  \    / \
        7    2  5   1
返回:

[
   [5,4,11,2],
   [5,8,4,5]
]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/path-sum-ii
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
* */
public class 路径总和II_113 {

    /*
    * 利用深度优先搜索：
    *  当 满足条件时 判断 当前节点是否为 叶子节点
    * 如果是叶子节点，就将结果加入 result 中
    * 如果不是叶子节点，就继续搜索下去
    * */
    private List<List<Integer>> result = new ArrayList<>();
    public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
        f(new ArrayList<Integer>(),root,0,targetSum);
        return result;
    }

    public void f(List<Integer> temp,TreeNode p,int sum,int targetSum){
        if(p == null){
            // 没有子节点
            return ;
        }
        temp.add(p.val);
        if( sum + p.val == targetSum){
            // 如果相等，可以判断是否为叶子节点了
            if( p.left == null && p.right == null){
                result.add(new ArrayList<>(temp));
            }
        }
        // 继续遍历 左子树
        f(temp,p.left,sum+p.val,targetSum);
        f(temp,p.right,sum+p.val,targetSum);
        // 回溯
        temp.remove(temp.size()-1);
    }

    /*
    * 也可以使用广度优先搜索
    * 当 满足条件，判断当前节点是否为叶子节点即可
    * */
}
